package cn.iocoder.yudao.module.erp.service.secstock;

import java.util.*;

import cn.hutool.core.date.DateTime;
import cn.iocoder.yudao.module.erp.controller.admin.secaccount.vo.SecHisAccountRespVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.checkout.CheckOutItemDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.secaccount.SecAccountDO;
import jakarta.validation.*;
import cn.iocoder.yudao.module.erp.controller.admin.secstock.vo.*;
import cn.iocoder.yudao.module.erp.dal.dataobject.secstock.SecStockDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;

import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;

/**
 * ERP 二级库库存 Service 接口
 *
 * @author 芋道源码
 */
public interface SecStockService {

    /**
     * 创建ERP 二级库库存
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createSecStock(@Valid SecStockSaveReqVO createReqVO);

    /**
     * 更新ERP 二级库库存
     *
     * @param updateReqVO 更新信息
     */
    void updateSecStock(@Valid SecStockSaveReqVO updateReqVO);

    /**
     * 删除ERP 二级库库存
     *
     * @param id 编号
     */
    void deleteSecStock(Long id);

    /**
     * 获得ERP 二级库库存
     *
     * @param id 编号
     * @return ERP 二级库库存
     */
    SecStockDO getSecStock(Long id);

    /**
     * 获得ERP 二级库库存分页
     *
     * @param pageReqVO 分页查询
     * @return ERP 二级库库存分页
     */
    PageResult<SecStockDO> getSecStockPage(SecStockPageReqVO pageReqVO);

    /**
     * 根据 type 获得ERP 二级库库存
     * @param type
     * @return
     */
    List<SecStockDO> getSecStockByDeptId(List<Integer> type,String Sname,String deptId);


    /**
     * 获得产品 VO 列表
     *
     * @param ids 编号数组
     * @return 产品 VO 列表
     */
    List<SecStockRespVO> getSecStockVOList(Collection<Long> ids);
    /**
     * 获得产品 VO Map
     *
     * @param ids 编号数组
     * @return 产品 VO Map
     */
    default Map<Long, SecStockRespVO> getSecStockVOMap(Collection<Long> ids) {
        return convertMap(getSecStockVOList(ids), SecStockRespVO::getId);
    }

    List<SecStockRespVO> getProductIds();

    List<String> getBatchsByProductId(Long productId);

    SecStockDO getProductByBatch(Long productId, String productBatch);

    List<SecStockDO> getsecStockList();

    void updateSecStockCount(SecStockDO productByBatch);

    List<SecStockDO> getProductsByBatch(List<SecStockDO> collect);

    void updateSecStockCountBatch(List<SecStockDO> stocksToUpdate);

    PageResult<SecStockDO> getSecStockPageByDetain(@Valid SecStockPageReqVO pageReqVO);

    List<Integer> getIds();

    List<String> getStandardsByProductName(String productName);

    List<String> getInboundBatchsByProductId(Long productId, String productBatch);

    List<SecStockDO> getsecStockListByBatch();

    List<SecStockDO> selectStockListByProductBatch(List<SecStockDO> stocks);

    List<SecStockDO> getStock(String deptId, String productId);

    void reduceStock(String deptId, String productId, int num);

    List<SecHisAccountRespVO> getStockAccount(String deptId, String productId, Integer outInType, DateTime outInTimeS, DateTime outInTimeE);

    Map<String, Integer> sellProduct(List<Map<String, String>> sellList);

    List<Long> virtualCreate(@Valid List<SecStockSaveReqVO> createReqVOList);

    void virtualUpdate(@Valid List<SecStockSaveReqVO> updateReqVOList);

    void virtualPack(VirtualPackReqVO virtualPackReqVO);
}